package com.shiqi.nio;

/**
 * @author shiqi
 * @version 1.0.0
 * @ClassName TestBuffer.java
 * @Description
 * @createTime 2022-05-16
 */

import org.junit.jupiter.api.Test;

import java.nio.ByteBuffer;

public class TestBuffer {

    @Test
    public void test1() {
        String str = "itheima"; //length=7 英文字母占用7个字节
        //1. 分配一个指定大小的缓冲区
        ByteBuffer buf = ByteBuffer.allocate(1024);
        System.out.println("-----------------allocate()----------------");
        System.out.println(buf.position()); //0
        System.out.println(buf.limit());    //1024
        System.out.println(buf.capacity()); //1024

        //2. 利用 put() 存入数据到缓冲区中
        buf.put(str.getBytes());
        System.out.println("-----------------put()----------------");
        System.out.println(buf.position()); //7  position表示下一个要读写的位置的索引
        System.out.println(buf.limit()); //1024
        System.out.println(buf.capacity()); //1024

        //3. 切换读取数据模式, 将缓冲区的界限设置为当前位置，然后当前位置设置为0
        buf.flip();
        System.out.println("-----------------flip()----------------");
        System.out.println(buf.position()); //0
        System.out.println(buf.limit()); //7
        System.out.println(buf.capacity()); //1024

        //4. 利用 get() 读取缓冲区中的数据
        byte[] dst = new byte[buf.limit()];
        buf.get(dst);
        System.out.println("-----------------get()----------------");
        System.out.println(new String(dst, 0, dst.length)); //itheima
        System.out.println(buf.position()); //7
        System.out.println(buf.limit()); //7
        System.out.println(buf.capacity());//1024

        //5. rewind() : 可重复读
        buf.rewind();
        System.out.println("-----------------rewind()----------------");
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        //6. clear() : 清空缓冲区. 但是缓冲区中的数据依然存在，但是处于“被遗忘”状态
        // 添加数据的时候，才会被覆盖
        buf.clear();
        System.out.println("-----------------clear()----------------");
        System.out.println(buf.position()); //0
        System.out.println(buf.limit()); // 1024
        System.out.println(buf.capacity()); //1024
        System.out.println((char) buf.get());//i   获取的是第一个字节，添加数据的时候才会覆盖掉
    }

    @Test
    public void test2() {
        String str = "itheima";
        ByteBuffer buf = ByteBuffer.allocate(1024);
        buf.put(str.getBytes());
        buf.flip();
        byte[] dst = new byte[buf.limit()];
        System.out.println(new String(dst)); // 此时还没有get 输出是空
        buf.get(dst, 0, 2); // get从0开始读2个
        System.out.println(new String(dst, 0, 2));//it
        System.out.println(buf.position()); // 2

        //mark() : 标记
        buf.mark();  //标记此时刻的位置, position 为2
        buf.get(dst, 2, 2);
        System.out.println(new String(dst, 2, 2)); //he
        System.out.println(buf.position()); //4
        //reset() : 恢复到 mark 的位置 即2
        buf.reset();
        System.out.println(buf.position());  //2
        //判断缓冲区中是否还有剩余数据
        if (buf.hasRemaining()) {
            //获取缓冲区中可以操作的数量
            System.out.println(buf.remaining()); //5
        }
    }

    @Test
    public void test3() {
        //分配直接缓冲区
        ByteBuffer buf = ByteBuffer.allocateDirect(1024);
        System.out.println(buf.isDirect()); //true
    }

}

